<?php 
/**
 *  Por Federico Pisarello - SisDev Software (c) 2013 - Buenos Aires, Argentina.
 * 	fpisarello@sisdevsoft.com
 */

require("includes/funciones.inc.php");

session_start();
if(!isset($_SESSION['nombreUsuario']))
	exit();

function searchABMPicking()
{
	require("includes/constants.php");
	require("includes/datatables_db/Datatables.php");
	
	$datatables = new Datatables();
	
	$datatables
			->select('p.idPicking, p.fecha, pe.idPedido, c.cuit, c.razonSocial')
			->from('picking p')
			->edit_column('p.fecha','$1','formatoFecha(p.fecha)') // php functions
			->add_column('edit', '<img src="images/details_open.png">')
			->join('pedidos pe','p.idPedido = pe.idPedido', 'inner')
			->join('clientes c','c.idCliente = pe.idCliente', 'inner')
			->where("p.estado <> '".$stateErase."'");

	return $datatables->generate();	
}

function searchPedidos()
{
	require("includes/constants.php");
	require("includes/datatables_db/Datatables.php");

	$datatables = new Datatables();

	$datatables
			->select('p.idPedido, p.fecha, c.cuit, c.razonSocial, p.idPedido AS idPedidoEstado')
			->from('pedidos p')
			->edit_column('p.fecha','$1','formatoFecha(p.fecha)') // php functions
			->edit_column('idPedidoEstado','$1','estadoPedido(idPedidoEstado)') // php functions
			->join('clientes c','c.idCliente = p.idCliente', 'inner')
			->join("picking pi","p.idPedido = pi.idPedido AND pi.estado <> '".$stateErase."'", 'left')
			->where("p.estado <> '".$stateErase."'");

	return $datatables->generate();
}

function estadoPedido($idPedido)
{
	require("includes/constants.php");
	
	$DB = NewADOConnection('mysqlt');
	$DB->Connect();
	$DB->Execute("SET NAMES utf8;");
	//$DB->debug=true;
	
	//Estado Rojo Sin Atender - No tiene asignado una Orden de Picking
	$strSQL = "SELECT * FROM picking WHERE idPedido = ".$idPedido;
	$rsPedido = $DB->Execute($strSQL);
	
	if($rsPedido->EOF)
		return '<center><img src="images/pedido_sin_atender.png" /></center>'; 
	
	
	$strSQL = "SELECT DISTINCT pi.idPedido, pi.item, pi.cantidad AS cantidadPedido, IFNULL(pii.cantidad,0) AS cantidad , IFNULL(um_pii.cantidad, 1) AS multiplo FROM pedidos_items pi
        		LEFT JOIN (SELECT idPedido, idItemPedido, idUnidad, SUM(cantidad) AS cantidad FROM picking_items GROUP BY idPedido, idItemPedido) pii ON pi.idPedido = pii.idPedido AND pii.idItemPedido = pi.item
				INNER JOIN articulos a ON pi.idArticulo = a.idArticulo
				LEFT JOIN unidad_medida um_pi ON pi.idUnidad = um_pi.idUnidadMedida
				LEFT JOIN unidad_medida um_pii ON pii.idUnidad = um_pii.idUnidadMedida 
				WHERE pi.idPedido = ".$idPedido;

	$rsPedidoItems = $DB->Execute($strSQL);
	
	$iSinAtender = 0;
	$iPedidoParcial = 0;	
	$iRegistros = 0;
	
	while(!$rsPedidoItems->EOF){
		
		//Si la cantidad es menor, el item esta pendiente
		if($rsPedidoItems->fields('multiplo') != null) {
			if($rsPedidoItems->fields('cantidadPedido') > ($rsPedidoItems->fields('cantidad') * $rsPedidoItems->fields('multiplo'))) {
				$iPedidoParcial++;
			}
		}
		else {
			if($rsPedidoItems->fields('cantidadPedido') > ($rsPedidoItems->fields('cantidad'))) {
				$iPedidoParcial++;
			}
		}
		
		$iRegistros++;
		$rsPedidoItems->MoveNext();
	}
	
	//Si llego hasta aca, es que esta el pedido Completo
	if($iSinAtender == 0 && $iPedidoParcial == 0)
		return '<center><img src="images/pedido_completo.png" /></center>';
	
	if($iSinAtender == $iRegistros)	
		return '<center><img src="images/pedido_sin_atender.png" /></center>';
	
	return '<center><img src="images/pedido_parcial.png" /></center>';
}


function addOrEdit()
{
	require("includes/constants.php");

	$DB = NewADOConnection('mysqlt');
	$DB->Connect();
	$DB->Execute("SET NAMES utf8;");
	//$DB->debug=true;
		
	$DB->StartTrans(); // start transaction
	
	$fecha = date("Y-m-d", strtotime('now'));
		
	if(!isset($_REQUEST["idPicking"])){

		$strSQL = "INSERT INTO picking ( ";
		$strSQL .= "	fecha, ";
		$strSQL .= "	idPedido, ";
		$strSQL .= "	estado ";
		$strSQL .= "	) VALUES ( ";
		$strSQL .= "	'".$fecha."', ";
		$strSQL .= "	'".$_REQUEST["idPedido"]."', ";
		$strSQL .= "	'".$stateAdd."' ";
		$strSQL .= "	)";
		
		$DB->Execute($strSQL);
		$insert_ID = $DB->Insert_ID();
		
		$arrItems = json_decode($_REQUEST["jaItems"]);
		$estadoPedido = $estadoCompleto;
		foreach ($arrItems as $joItem) {
			
			if($joItem->cantidad>0) {
				if($joItem->tipo == $tipoMuestra) {
					$strSQL = "INSERT INTO picking_items VALUES ( ";
					$strSQL .= "	".$insert_ID.", ";
					$strSQL .= "	".$_REQUEST["idPedido"].", ";
					$strSQL .= "	".$joItem->idItemPedido.", ";
					$strSQL .= "	'".$joItem->idUnidad."', ";
					$strSQL .= "	'".$joItem->cantidad."' ";
					$strSQL .= "	)";
			
					$DB->Execute($strSQL);
				}
				
				if($joItem->tipo == $tipoProduccion) {
					$strSQL = "INSERT INTO picking_items VALUES ( ";
					$strSQL .= "	".$insert_ID.", ";
					$strSQL .= "	".$_REQUEST["idPedido"].", ";
					$strSQL .= "	".$joItem->idItemPedido.", ";
					$strSQL .= "	0, "; //No tiene unidad de Medida, son la Pizas
					$strSQL .= "	'".$joItem->cantidad."' ";
					$strSQL .= "	)";
						
					$DB->Execute($strSQL);
										
					foreach ($joItem->piezas as $joPieza) {
						$strSQL = "INSERT INTO picking_piezas VALUES ( ";
						$strSQL .= "	".$insert_ID.", ";
						$strSQL .= "	".$_REQUEST["idPedido"].", ";
						$strSQL .= "	".$joItem->idItemPedido.", ";
						$strSQL .= "	".$joPieza." ";
						$strSQL .= "	)";
						
						$DB->Execute($strSQL);
					}
				}
				
				//Actualizo el Stock en Articulos
				$DB->Execute("UPDATE articulos_variedades SET cantidad = cantidad - ".$joItem->cantidad." WHERE idArticulo = ".$joItem->idArticulo." AND variedad = '".$joItem->variedad."'");
			}
		}
	}
	else{
		$strSQL = "UPDATE picking SET ";
		$strSQL .= "	estado = '".$stateModify."' ";
		$strSQL .= " WHERE idPicking = ". $_REQUEST["idPicking"];
		
		$DB->Execute($strSQL);
		
		$DB->Execute("DELETE FROM picking_items WHERE idPicking = ". $_REQUEST["idPicking"]);
		$DB->Execute("DELETE FROM picking_piezas WHERE idPicking = ". $_REQUEST["idPicking"]);
		$arrItems = json_decode($_REQUEST["jaItems"]);
		$estadoPedido = $estadoCompleto;
		foreach ($arrItems as $joItem) {

			if($joItem->cantidad>0) {
				if($joItem->tipo == $tipoMuestra) {
					$strSQL = "INSERT INTO picking_items VALUES ( ";
					$strSQL .= "	".$insert_ID.", ";
					$strSQL .= "	".$_REQUEST["idPedido"].", ";
					$strSQL .= "	".$joItem->idItemPedido.", ";
					$strSQL .= "	'".$joItem->idUnidad."', ";
					$strSQL .= "	'".$joItem->cantidad."' ";
					$strSQL .= "	)";
			
					$DB->Execute($strSQL);
				}
				
				if($joItem->tipo == $tipoProduccion) {
					$strSQL = "INSERT INTO picking_items VALUES ( ";
					$strSQL .= "	".$insert_ID.", ";
					$strSQL .= "	".$_REQUEST["idPedido"].", ";
					$strSQL .= "	".$joItem->idItemPedido.", ";
					$strSQL .= "	0, "; //No tiene unidad de Medida, son la Pizas
					$strSQL .= "	'".$joItem->cantidad."' ";
					$strSQL .= "	)";
						
					$DB->Execute($strSQL);
					
					foreach ($joItem->piezas as $joPieza) {
						$strSQL = "INSERT INTO picking_piezas VALUES ( ";
						$strSQL .= "	".$insert_ID.", ";
						$strSQL .= "	".$_REQUEST["idPedido"].", ";
						$strSQL .= "	".$joItem->idItemPedido.", ";
						$strSQL .= "	".$joPieza." ";
						$strSQL .= "	)";
						
						$DB->Execute($strSQL);
					}
				}
				
				//Actualizo el Stock en Articulos
				$DB->Execute("UPDATE articulos_variedades SET cantidad = cantidad - ".$joItem->cantidad." WHERE idArticulo = ".$joItem->idArticulo." AND variedad = '".$joItem->variedad."'");
			}		
		}
	}
	
	if (!$DB->CompleteTrans())
	{
		$arrJSON->status = "ERROR";
		$arrJSON->msg = "Error al Grabar la Orden de Picking";
	}
	else
	{
		$arrJSON->status = "OK";
		$arrJSON->msg = "La Orden de Picking fue Guardado con Exito";
	}	
	return json_encode($arrJSON);
}

function del()
{
	require("includes/constants.php");
	
	$DB = NewADOConnection('mysqlt');
	$DB->Connect();
	$DB->Execute("SET NAMES utf8;");
	//$DB->debug=true;
	
	//Verifico que no este Facturado
	$strSQL = "SELECT idPicking FROM facturas WHERE estado <> '$stateErase' AND idPicking = " . $_REQUEST["idPicking"];
	$rsFactura = $DB->Execute($strSQL);
	
	if(!$rsFactura->EOF)
	{
		$arrJSON->status = "ERROR";
		$arrJSON->msg = "La Orden de Picking ya esta Facturada";
		return json_encode($arrJSON);
	}
	
	$DB->StartTrans(); // start transaction
	$DB->Execute("UPDATE picking SET estado = '$stateErase' WHERE idPicking = " . $_REQUEST["idPicking"]); // execute query	
	
	//Actualizo el Stock antes de Eliminar los Items
	$strSQL = "SELECT pk.*, pe.idArticulo, pe.variedad FROM picking_items pk
				INNER JOIN pedidos_items pe ON pk.idPedido = pe.idPedido AND pk.idItemPedido = pe.item
				WHERE idPicking = " . $_REQUEST["idPicking"];
	$rsItems = $DB->Execute($strSQL);
	
	while(!$rsItems->EOF){		
		//Actualizo el Stock en Articulos
		$DB->Execute("UPDATE articulos_variedades SET cantidad = cantidad + ".$rsItems->fields('cantidad')." WHERE idArticulo = ".$rsItems->fields('idArticulo')." AND variedad = '".$rsItems->fields('variedad')."'");
		$rsItems->MoveNext();
	}
	$DB->Execute("DELETE FROM picking_items WHERE idPicking = " . $_REQUEST["idPicking"]); // execute query
	$DB->Execute("DELETE FROM picking_piezas WHERE idPicking = " . $_REQUEST["idPicking"]); // execute query

	if (!$DB->CompleteTrans())
	{
		$arrJSON->status = "ERROR";
		$arrJSON->msg = "Error al Eliminar la Orden de Picking";
	}
	else
	{
		$arrJSON->status = "OK";
		$arrJSON->msg = "La Orden de Picking se Elimino Correctamente";
	}	
	return json_encode($arrJSON);
}

function editPicking()
{
	require("includes/constants.php");
	
	$DB = NewADOConnection('mysqlt');
	$DB->Connect();
	$DB->Execute("SET NAMES utf8;");
	//$DB->debug=true;
	
	$rsPicking = $DB->Execute("SELECT p.*, c.razonSocial FROM picking p
								INNER JOIN pedidos pe ON p.idPedido = pe.idPedido
								LEFT JOIN clientes c ON pe.idCliente = c.idCliente
								WHERE p.estado <> '$stateErase' AND p.idPicking = " . $_REQUEST["idPicking"]); // execute query
						
	if(!$rsPicking->EOF){
		$joPicking->data['fecha'] = date("d-m-Y", strtotime($rsPicking->fields("fecha")));
		$joPicking->data['razonSocial'] = $rsPicking->fields("razonSocial");
		
		$strSQL = "SELECT pe.item, pe.idArticulo, pe.descripcion AS descArticulo, a.grupoProducto, pe.tipo, pe.variedad, um_pe.descripcion AS descUnidadMedidaPedido, pe.cantidad AS cantidadPedido, pi.idUnidad, um_pi.descripcion AS descUnidadMedida, pi.cantidad 
						FROM picking_items pi
						INNER JOIN pedidos_items pe ON pe.idPedido = pi.idPedido AND pe.item = pi.idItemPedido   
						INNER JOIN articulos a ON a.idArticulo = pe.idArticulo
						LEFT JOIN unidad_medida um_pe ON pe.idUnidad = um_pe.idUnidadMedida
						LEFT JOIN unidad_medida um_pi ON pi.idUnidad = um_pi.idUnidadMedida
						WHERE pi.idPicking = " . $rsPicking->fields("idPicking");

		$rsPickingItems = $DB->Execute($strSQL);
		
		$arrPickingItems = array();
		while(!$rsPickingItems->EOF){
			
			$objPickingItem = "";
			$objPickingItem->idItemPedido = $rsPickingItems->fields('item');
			$objPickingItem->idArticulo = $rsPickingItems->fields('idArticulo');
			$objPickingItem->descArticulo = $rsPickingItems->fields('descArticulo');
			$objPickingItem->grupoProducto = $rsPickingItems->fields('grupoProducto');
			$objPickingItem->tipo = $rsPickingItems->fields('tipo');
			$objPickingItem->variedad = $rsPickingItems->fields('variedad');
			$objPickingItem->descUnidadMedidaPedido = $rsPickingItems->fields('descUnidadMedidaPedido');
			$objPickingItem->cantidadPedido = $rsPickingItems->fields('cantidadPedido');
			$objPickingItem->idUnidad = $rsPickingItems->fields('idUnidad');
			$objPickingItem->descUnidadMedida = $rsPickingItems->fields('descUnidadMedida');
			$objPickingItem->cantidad = $rsPickingItems->fields('cantidad');
			
			array_push($arrPickingItems, $objPickingItem);
			$rsPickingItems->MoveNext();
		}
		$joPicking->data['pickingItems'] = $arrPickingItems;
		
		return json_encode($joPicking->data);
	}
	else
		return json_encode(array());
}

function getUnidadesMedida()
{
	require("includes/constants.php");

	$DB = NewADOConnection('mysqlt');
	$DB->Connect();
	$DB->Execute("SET NAMES utf8;");
	//$DB->debug=true;
	
	$strSQL = "SELECT * FROM (
				SELECT * FROM unidad_medida WHERE idUnidadMedida = ".$_REQUEST['idUnidadMedidaPedido']."
				UNION ALL
				SELECT * FROM unidad_medida WHERE idUnidadPadre = ".$_REQUEST['idUnidadMedidaPedido'].") unidades_medida
				WHERE estado <> '$stateErase' AND descripcion LIKE '%".$_REQUEST['term']."%'";

	$rsUnidad = $DB->Execute($strSQL);

	if($rsUnidad->EOF)
		return json_encode(array());

	$i=0;
	while(!$rsUnidad->EOF){
		$arrUnidad->data[$i]['id'] = $rsUnidad->fields('idUnidadMedida');
		$arrUnidad->data[$i++]['value'] = $rsUnidad->fields('descripcion');
		$rsUnidad->MoveNext();
	}

	return json_encode($arrUnidad->data);
}

function searchPickingDetalle()
{
	require("includes/constants.php");

	$DB = NewADOConnection('mysqlt');
	$DB->Connect();
	$DB->Execute("SET NAMES utf8;");
	//$DB->debug=true;
	
	$strSQL = "SELECT pii.*, pi.cantidad canPicking, a.codProducto FROM picking_items pi
				INNER JOIN pedidos_items pii ON pi.idItemPedido = pii.item AND pi.idPedido = pii.idPedido
				INNER JOIN articulos a ON pii.idArticulo = a.idArticulo
				WHERE pi.idPicking = ".$_REQUEST["idPicking"];

	$rsPickingItems = $DB->Execute($strSQL);

	if($rsPickingItems->EOF)
		return "";

	$strOutput = "<tr><td>Cod. Facturaci&oacute;n</td><td>Descripci&oacute;n</td><td>Variedad</td><td>Cantidad Pedida</td><td>Cantidad</td></tr>";

	while(!$rsPickingItems->EOF){
		$strOutput .= "<tr><td>".$rsPickingItems->fields("codProducto")."</td><td>".$rsPickingItems->fields("descripcion")."</td><td>".$rsPickingItems->fields("variedad")."</td><td>".$rsPickingItems->fields("cantidad")."</td><td>".$rsPickingItems->fields("canPicking")."</td></tr>";
		$rsPickingItems->MoveNext();
	}

	return $strOutput;
}

function cargaItemsPedido()
{
	require("includes/constants.php");
	
	$DB = NewADOConnection('mysqlt');
	$DB->Connect();
	$DB->Execute("SET NAMES utf8;");
	//$DB->debug=true;
	
	$rsCliente = $DB->Execute("SELECT c.* FROM clientes c
									INNER JOIN pedidos p ON c.idCliente = p.idCliente  
									WHERE p.idPedido = ".$_REQUEST["idPedido"]);
	
	$joPedido->data['razonSocial'] = $rsCliente->fields("razonSocial");
	
	$strSQL = "SELECT DISTINCT pi.item, pi.idArticulo, pi.descripcion, a.grupoProducto, pi.tipo, pi.variedad, um_pi.idUnidadMedida AS idUnidadMedidaPedido, um_pi.descripcion AS descUnidadMedida, IFNULL(um_pii.cantidad, 1) AS multiplo, pi.cantidad AS cantidadPedido, IFNULL(pii.cantidad, 0) AS cantidad FROM pedidos_items pi
        		LEFT JOIN (SELECT idPedido, idItemPedido, idUnidad, SUM(cantidad) AS cantidad FROM picking_items GROUP BY idPedido, idItemPedido) pii ON pi.idPedido = pii.idPedido AND pii.idItemPedido = pi.item
				INNER JOIN articulos a ON pi.idArticulo = a.idArticulo
				LEFT JOIN unidad_medida um_pi ON pi.idUnidad = um_pi.idUnidadMedida
				LEFT JOIN unidad_medida um_pii ON pii.idUnidad = um_pii.idUnidadMedida 
				WHERE pi.idPedido = ".$_REQUEST["idPedido"]." ORDER BY pi.item";
	
	$rsPedidoItems = $DB->Execute($strSQL);
	
	$arrPedidoItems = array();
	while(!$rsPedidoItems->EOF){
		if($rsPedidoItems->fields('cantidad') * $rsPedidoItems->fields('multiplo') < $rsPedidoItems->fields('cantidadPedido')) {
			$objPedidoItem = "";
			$objPedidoItem->idItemPedido = $rsPedidoItems->fields('item');
			$objPedidoItem->idArticulo = $rsPedidoItems->fields('idArticulo');
			$objPedidoItem->descArticulo = $rsPedidoItems->fields('descripcion');
			$objPedidoItem->grupoProducto = $rsPedidoItems->fields('grupoProducto');
			$objPedidoItem->tipo = $rsPedidoItems->fields('tipo');
			$objPedidoItem->variedad = $rsPedidoItems->fields('variedad');
			$objPedidoItem->idUnidadMedidaPedido = $rsPedidoItems->fields('idUnidadMedidaPedido');
			$objPedidoItem->descUnidadMedidaPedido = $rsPedidoItems->fields('descUnidadMedida');
			$objPedidoItem->cantidadPedido = $rsPedidoItems->fields('cantidadPedido') - ($rsPedidoItems->fields('cantidad') * $rsPedidoItems->fields('multiplo'));				
				
			array_push($arrPedidoItems, $objPedidoItem);
		}
		$rsPedidoItems->MoveNext();
	}
	$joPedido->data['pedidoItems'] = $arrPedidoItems;
	
	return json_encode($joPedido->data);
}

function cargarPiezas()
{
	require("includes/constants.php");
	require("includes/datatables_db/Datatables.php");

	$datatables = new Datatables();

	$datatables->select('idArticuloPieza, descripcion, variedad, cantidad')
					->from('articulos_piezas')
					->where("idArticulo = ".$_REQUEST['idArticulo'])
					->where("variedad = '".$_REQUEST['variedad']."'")
					->where("idArticuloPieza NOT IN (SELECT idPieza FROM picking_piezas)")
					->where("tipo = '$tipoProduccion'")
					->edit_column('idArticuloPieza', '<input class="piezasClass" style="width: 10px;" onclick="$_addRemoveItem($1, \'$2\')" id="$1" type="checkbox">', 'idArticuloPieza, cantidad');

	return $datatables->generate();	
}

switch($_REQUEST['accion'])
{
	case "NEW":
		echo cargaItemsPedido();
		break;
	case "EDIT":
		echo editPicking();
		break;
	case "DELETE":
		echo del();
		break;
	case "searchPedidos":
		echo searchPedidos();
		break;
	case "search":
		echo searchABMPicking();
		break;		
	case "addOrEdit":
		echo addOrEdit();
		break;
	case "getUnidadesMedida":
		echo getUnidadesMedida();
		break;
	case "searchPickingDetalle":
		echo searchPickingDetalle();
		break;
	case "cargarPiezas":
		echo cargarPiezas();
		break;
}
?>
